文件上传漏洞详解1 | 您所在的位置:网站首页 › 经典fck编辑器之文件上传实验记录 › 文件上传漏洞详解1 |
什么是文件上传 文件上传是一个网站的常见功能,多用于上传照片、视频、文档等许多类型文件。 一般文件上传的流程如下: 前端选择文件进行提交。 浏览器形成POST Multipart报文发送到服务器。 服务器中间件接收到报文,解析后交给相关后端代码进行处理。 后端代码将上传的文件类容写入到临时文件中 (php特有)。 写入到文件中,文件名为提交的文件名或是以一定规则生成的文件名。 什么是文件上传漏洞 当文件上传点未对上传的文件进行严格的验证和过滤时,就容易造成任意文件上传,包括上传动态的文件(asp/php/jsp等等)。 如果上传的目标目录没有限制执行权限,导致所上传的动态文件(比如webshell、木马,病毒,恶意脚本)可以正常执行并且可以访问,即造成了文件上传漏洞。 总之,存在文件上漏洞的必要条件是: 存在上传点 可以上传动态文件 上传目录有执行权限,并且上传的文件可以执行。 可以访问到上传的动态文件 文件上传漏洞检测流程 为了防止恶意文件上传,上传文件到写入服务器要经过上图所示的一系列检验,而对于我们渗透测试人员就要想办法绕过这些检验。下面我们就来讲解这些绕过方法。 客户端检测绕过 客户端检测一般只检测扩展名 顾名思义,就是在文件被上传到服务端的时候,对于文件名的扩展名进行检查,如果不合法,则拒绝这次上传 在这里,还有一点是值得一提的,在检查扩展名是否合法的时候,有两种策略 黑名单策略,文件扩展名在黑名单中的为不合法,示例代码 白名单策略,文件扩展名不在白名单中的均为不合法 白名单策略是更加安全的,通过限制上传类型为只有我们接受的类型,可以较好的保证安全,因为黑名单我们可以使用各种方法来进行注入和突破 客户端进行的检测,可通过对客户端代码的一些修改或者直接拦截修改报文即可绕过,所以这种上传限制等于没有。 1.前端JAVAscript的检测一般是在事件当中,一般来说在 onsubmit事件当中。 对于这种检测我们只需要通过浏览器的审查元素功能,删除其中的检测函数即可,如下图我们删除红线标示的检查函数即可上传没有在白名单的文件 2.拦截报文修改绕过 首先选择正常的文件进行上传 然后通过burpsuite进行截包改包完成文件上传 这种方法前端检测绕过通用,无需理会具体的前端检测代码,直接绕过前端进行上传报文的修改并提交 如下图所示,我们只需要在上传文件前,把php文件扩展名改成白名单允许的扩展名,然后点击上传,然后通过burpsuite截包,然后把扩展名修改回来,即可绕过前端的检测。 服务器检测绕过 前端检测通过截包改包的方式可以绕过绝大部分检测,但服务器检测需要我们去猜测检测方法,具体检测了哪些点具体检测了哪些位置。 在服务器检测中一般会检测如下几个位置: 1.文件名或者说是文件扩展名。 2.MIME/TYPE(浏览会根据文件扩展名进行选择)。 3.文件类容。 MIME类型绕过 MIME(Multipurpose Internet Mail Extensions)是描述消息类容类型的因特网标准。 MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。 浏览器会自动根据上传文件的扩展名,对应到相应的类型上。 我们也只需要通过抓包,如下图把Content-Type:后面类容改成MIME TYPE 白名单类型即可绕过。 文件类容检测绕过 文件类容检测绕过一般分为检测文件是否是我们所期望的文件类型,也就是图片上传点上传的是否为图像,另一种就是检测文件中是否存在恶意类容。 首先我们来看文件是否为所期望的类型。 1.简单文件头检测 文件头是位于文件开头的一段承担一定任务的数据,一般都在开头部分。 文件头的起始部分中一般开头标记文件类型。如gif文件头为GIF89a或 GIF87a。 如下图所示代码为文件头检测函数,是通过文件头的起始部分进行匹配,是比较简单的文件类型检测方法。 这种简单的只对文件头进行匹配的方法,可以通过在上传的文件前追加合法的文件头进行绕过。 如下图所示,我们只需要在文件类容前面加上GIF89a即可饶过上传。 2.完整文件检测绕过 通过调用图像函数 (如getimagesize / imagecreatefromgif / imagecreatefrompng)进行检测文件是否为图像,需文件内容保持相对完整,所以无法通过追加文件头部起始字节的方法进行绕过。 针对这种检测可以将图片文件与欲上传文件进行合并来绕过检测。合并后的文件只要没有经过清洗或缩放等操作即可通过检测,并保持欲上传文件的完整。由于上传文件图片部分在解析为PHP时会以乱码显示,建议与尽量小的图片文件进行合并,否则会有大量的乱码。 可以通过copy命令进行合并 首先我们用windows自带画板工具生成1*1像素的GIF图片文件,取名为main.gif。 然后打开CMD,用下图命令把 main.gif和phpinfo.php文件合并,新文件名为phpinfo_gif.php。这样就可以绕过。 3.恶意文件类容检测 检测提交类容中是否包含webshell等数据。 推荐使用强混淆的weevely进行尝试,kali中自带。 https://github.com/sunge/Weevely 或尝试开源的webshell手机项目: http://github.com/tennc/webshell 恶意文件常见关键字: eval base64_encode assert java.lang.Runtime java.lang.ProcessBuilder 服务端绕过小技巧 1.文件参数多filename属性 文件上传过程中,如果存在waf拦截一些扩展名,可以通过尝试多个filename属性。 如下图左侧filename有两个filename属性,filename="phpinfo.png"; filename="phpinfo11.php",右侧显示phpinfo11.php上传成功。如果waf取值是filename="phpinfo.png",而服务器取值是filename="phpinfo11.php",哪么就可以绕过,这种情况主要针对于waf的取值与服务器的取值有差异进行。 2.目录可控时可以尝试目录穿越的方法 下图是一段配置文件,意思是在D:/www/liuxing/upload/目录下匹配到扩展名为php|php3|php4的文件则不能访问,也就是说我们将文件上传到这个目录下是无法进行执行的。 但是如果目录在可控的情况下,我们可以吧文件上传到别的没有被禁止路径下进行执行。 如下图我们输入../../,上传到前两级目录,就可以执行了。 |
今日新闻 |
推荐新闻 |
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 |